#include "t0022-0.h"
#include "cui.h"

#define MODNAME     "[UTL]"

/*
cJSON helper functions
*/
int cJSON_ValidItem(cJSON *node, int type) {
	if (node == NULL || node->type != type) {
		return 0;
	}

	return 1;
}

int cJSON_ValidArray(cJSON *node) {
	if (node == NULL || node->type != cJSON_Array) {
		return 0;
	}

	return 1;
}

int cJSON_ValidNumber(cJSON *node) {
	if (node == NULL || node->type != cJSON_Number) {
		return 0;
	}

	return 1;
}

int cJSON_ValidString(cJSON *node) {
	if (cJSON_ValidItem(node, cJSON_String) == 1 && node->valuestring != NULL && strlen(node->valuestring) != 0) {
		return 1;
	}
	return 0;
}

int is_string_equal_safe(const char *s1, const char *s2)
{
	if (s1 != NULL && s2 != NULL) {
		size_t n = strlen(s1);
		if (n == strlen(s2) && strncmp(s1, s2, n) == 0) {
			return 1;
		}
	}
	return 0;
}

int is_string_equal_safe2(const char *s1, const char *s2, size_t n)
{
	if (s1 != NULL && s2 != NULL) {
		if (strncmp(s1, s2, n) == 0) {
			return 1;
		}
	}
	return 0;
}

char *strncpy_safe(char *dest, const char *src, size_t n)
{
	size_t tmp = strlen(src);
	n = tmp < n ? tmp : n - 1;
	return strncpy(dest, src, n);
}

// 判断字符串是否是整数
int is_integer(const char *str) {
	if (str == NULL) return 0;
    if (*str == '-' || *str == '+') str++; // 处理负数或正数
    if (*str == '\0') return 0; // 空字符串不是数字
    while (*str) {
        if (!isdigit((unsigned char)*str)) return 0;
        str++;
    }
    return 1;
}

// 判断字符串是否是浮点数
int is_float(const char *str) {
    char *endptr;
    errno = 0; // 先将 errno 置为 0
	if (str == NULL) return 0;
    strtod(str, &endptr);
    // 检查是否没有剩余字符且没有错误发生
    return *endptr == '\0' && endptr != str && errno != ERANGE;
}

void extract_filename(const char *filepath, char *filename) {
    const char *last_slash = strrchr(filepath, '/'); // 寻找最后一个斜杠
    if (last_slash != NULL) {
        strcpy(filename, last_slash + 1); // 复制斜杠后面的内容到filename
    } else {
        strcpy(filename, filepath); // 如果没有斜杠，直接复制整个路径到filename
    }
}
